iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0
AI & Data

30 天入門常見的機器學習演算法系列 第 11

(Day 11) 二元分類任務驗證指標

  • 分享至 

  • xImage
  •  

今天要介紹的是常見的分類任務驗證指標,會以二元分類問題為例,因為多元分類也是用相同的指標,只是計算方式會有所不同而已,預計會用 2-3 天的篇幅介紹完,分類與迴歸任務的驗證指標;先給各位讀者一個正確的觀念,選指標時必須回到業務背景與資料特性,不要迷信某個數值越高越好,真正有價值的模型評估,是能在技術表現與業務需求之間找到平衡。

指標介紹

混淆矩陣 (Confusion Matrix)

分類任務的所有核心指標,幾乎都來自 Confusion Matrix,它是用來統計分類模型在測試集上的結果,Confusion Matrix 在 Binary Classification 問題上,它是一個 2x2 表格:

True Condition - Positive True Condition - Negative
Predict Outcome - Positive TP (True Positve) FP (False Positve) (誤報)
Predict Outcome - Negative FN (False Negative) (漏報) TN (True Negative)
  • TP: 實際是 Positive,模型也預測 Positive (預測正確)
  • TN: 實際是 Negative,模型也預測 Negative (預測正確)
  • FP: 實際是 Negative,但模型預測 Positive (誤報 / 假警報) (Type I error)
  • FN: 實際是 Positive,但模型預測 Negative (漏報 / 漏檢) (Type II error)

Accuracy (準確率)

$$
Accuracy = \frac{TP + TN}{TP + TN + FP + FN}
$$

就是看所有預測中,有多少的比例是預測正確的

  • 優點
    • 簡單直觀
    • 如果類別分佈平均 (Positive / Negative 差不多),可以直接解讀
  • 缺點
    • 如果類別分佈不平均 (e.g. 99% negative, 1% positive),即使全猜 negative 也能有 99% accuracy → 失真
  • 解讀
    • 數值越高越好

Precision (精確率)

Precision 是防止誤報 (Type I error) 的指標,適合保守策略,但單獨用它評估模型非常危險,因為它忽略漏報 (Type II error) 問題

$$
Precision = \frac{TP}{TP + FP}
$$

優點:

  • 抑制誤報 (False Positive, FP, Type I error): 高 Precision 代表 False Positive 少,模型很少有 Type I error
  • 在類別極度不平衡時,比 Accuracy 更能反映模型的實際效益 (尤其 Positive 很稀有時)

缺點:

  • 忽略漏報 (False Negative, FN, Type II error): 完全不管 FN,所以可能 Precision 很高,但可能 Recall 很低,對一些應用 (如詐欺偵測) 是致命的
  • 容易被閾值操控: 提高分類 threshold,確實可以提升 Precision,但會犧牲 Recall,導致模型只在「很確定」時才預測 Positive
  • 對整體表現無法單獨衡量: 單看 Precision 無法知道模型是否有廣泛檢出正例,需要搭配 Recall 或 F1-score

適用高誤報成本場景:

  • 醫療診斷 (假陽性會導致不必要的侵入性檢查)
  • 信用評分 (誤把壞客戶當好客戶會造成損失)

Recall (召回率 / 敏感度)

Recall 是防止漏報 (Type II error) 的指標,適合在漏報代價高的情境使用,但單看 Recall 容易造成誤報氾濫,因此常和 Precision 一起使用 (F1-score 或 Precision-Recall 曲線)

$$
Recall = \frac{TP}{TP + FN}
$$

優點:

  • 抑制漏報 (False Negative, FN, Type II error): 高 Recall 代表 False Negative 少,模型很少有 Type II error

缺點:

  • 忽略誤報 (False Positive, FP, Type I error): 完全不管 FN,所以可能 Recall 很高,但可能 Precision 很低
  • 容易被閾值操控: 降低分類 threshold,確實可以提升 Recall,但會犧牲 Precision (大量誤報)

適用高漏報成本場景:

(在安全性應用中重要,寧可多報也不能漏報)

  • 入侵檢測、工業故障預警
  • 癌症篩檢 (漏掉病人可能致命)、詐欺交易偵測 (漏掉會直接造成金錢損失)

F1-score

Precision 與 Recall 的調和平均 (harmonic mean),想同時兼顧 Precision (正例預測的正確性) 和 Recall (正例檢出的完整性) 時,用 F1-score 評估整體表現

$$
F1-score = 2 \times \frac{Precision \times Recall}{Precision + Recall}
$$

優點:

  • 平衡 Precision 與 Recall 適合同時重視誤報與漏報的情境
  • 對極端值敏感: 如果 Precision 或 Recall 有一個很低,F1 會反映這個缺陷 (不像普通平均可能被掩蓋)
  • 適用類別不平衡情境: 當 Positive 樣本很少時,比 Accuracy 更能反映模型品質
  • 簡單單一分數: 能把 Precision、Recall 濃縮成一個可比較的指標,方便模型之間比較

缺點:

  • 權重固定: F1 默認 Precision 和 Recall 的重要性一樣,但實務中可能某一方更重要 (此時應用 Fβ-score 調整權重)
  • 無法反映全域表現: 只是一個閾值下的結果,無法取代 ROC-AUC / PR-AUC 那種「不同閾值下的整體能力評估」
  • 容易被閾值影響: 和 Precision、Recall 一樣,閾值選擇不同,F1 會大幅變動
  • 忽略 TN: F1 完全不考慮 True Negative 的數量,對於負例判斷好壞的場景不敏感
    • 優點
      • 更專注稀有類別的檢測能力: TN 不會沖淡結果,F1 更能反映正例檢出的真實能力
      • 避免類別不平衡下的高分假象: 即使 99% TN,F1 也不會被刷高
    • 缺點
      • 低估模型在負例上的表現: 如果應用中 Negative 也很重要 (例如垃圾郵件分類中「正確放行正常郵件」很重要),F1 可能低估模型價值
      • 不適用需要同時關注 TN 與 TP 的場景: 例如醫療檢測中,誤把健康人當病人 (FP) 雖然嚴重,但正確判斷健康人 (TN) 也是有價值的,這時 Accuracy、Specificity 可能更適合補充

典型使用場景:

  • 正例與負例數量差異大 (類別不平衡)
  • 誤報與漏報代價相近: 想用一個分數快速比較多個模型的整體分類能力

ROC-AUC (Receiver Operating Characteristic - Area Under Curve)

ROC-AUC 是「排序能力」的評估指標,不是「預測正確率」,高 AUC 意味著模型傾向將正例分數排得比負例高,在類別極度不平衡的情況下,ROC-AUC 可能會給出過於樂觀的結果 (建議搭配 PR-AUC 與實際混淆矩陣分析)

優點:

  • 閾值無關: 評估的是模型在所有可能閾值下的整體表現,不依賴特定 cut-off
  • 對類別比例不敏感 (相對 Accuracy): 在類別不平衡的情況下,仍可提供較穩定的比較依據
  • 可視化能力強: 曲線可以直觀看出模型在不同 FPR 下的 TPR 表現
  • 可用於排序模型: 特別適合用在需要排序預測分數 (如風險評分、推薦系統) 的場景

缺點:

  • 在極端類別不平衡時可能過於樂觀: 因為 FPR 的分母是 TN,負例很多時,錯一些負例對 FPR 影響很小,AUC 看起來很好,但實際 Precision 可能很差
  • 無法反映預測機率的絕對校準性: 只看排序,不看分數本身準不準 (Calibration)
  • 不適合只關注正例的場景 如果漏報成本很高 (正例稀少),PR-AUC 更合適

典型使用場景:

  • ROC-AUC 特別適合:
    • 需要在不同閾值下比較模型整體區分能力
    • 正負例比例沒有極端不平衡
    • 想用單一數值比較排序能力 (例如風險評分模型)
  • 不適用:
    • 正例極少 (如詐欺偵測、罕見病檢測): 這時 PR-AUC 更能反映真實效果

ROC (Receiver Operating Characteristic) 曲線

當你改變分類閾值 (threshold) 時,模型會有不同的 TPR 與 FPR 組合,連起來就形成 ROC 曲線

  • x 軸 (False Positive Rate; FPR)
  • y 軸 (True Positive Rate; TPR), Recall

AUC (Area Under Curve) 曲線

ROC 曲線下的面積,就是 AUC

數值範圍:

  • 0.9 ≦ AUC ≦ 1.0 (outstanding discrimination極佳的鑑別力)
  • 0.8 ≦ AUC ≦ 0.9 (excellent discrimination優良的鑑別力)
  • 0.7 ≦ AUC ≦ 0.8 (acceptable discrimination可接受的鑑別力)
  • AUC = 0.5 (no discrimination 無鑑別力),ROC剛好是對角線
  • AUC < 0.5 分類方向顛倒 (把預測反過來就變好)

統計解讀:

  • AUC 等於「隨機取一個正例與一個負例時,模型把正例排在負例前的機率」

PR-AUC (Precision-Recall AUC)

PR-AUC 更貼近「找出稀有重要事件」的實務需求,在極度不平衡資料中,比 ROC-AUC 更真實,但它對正例比例非常敏感,因此跨資料集比較要小心

優點:

  • 適合稀有事件偵測: 在正例比例極低時,ROC-AUC 可能樂觀,但 PR-AUC 會真實反映誤報多寡
  • 直接反映 Precision-Recall 平衡: Precision 和 Recall 都直接與實務成本相關 (誤報 vs 漏報)
  • 曲線解讀直觀: 看得出在不同檢出率下,Precision 是否快速下降

缺點:

  • 受正例比例影響大: 正例比例變化會改變基準線 (baseline precision),不同數據集之間不一定可直接比較
  • 變動性高: 當正例數很少時,Precision 和 Recall 在高閾值下的波動大,曲線可能很抖
  • 計算結果不如 ROC 平滑: 因為 Precision 與 Recall 對少量樣本非常敏感

典型使用場景:

  • PR-AUC 特別適合:
    • 正例極少 (詐欺偵測、罕見病診斷)
    • 關注誤報與漏報的平衡
    • 想知道模型在不同 Recall 水平下能維持多少 Precision
  • 不適用:
    • 正負例比例接近且負例表現也同等重要 → ROC-AUC 更全面

PR 曲線

當你改變分類閾值 (threshold) 時,模型會有不同的 TPR 與 FPR 組合,連起來就形成 ROC 曲線

  • x 軸 (Precision)
  • y 軸 (Recall)

AUC (Area Under Curve) 曲線

PR 曲線下的面積

  • 範圍 0 ~ 1 (越接近 1 越好)

PR-AUC vs ROC-AUC 的差異

特性 ROC-AUC PR-AUC
橫軸 FPR Recall
縱軸 TPR Precision
適用場景 類別分布均衡或中等不平衡 極度類別不平衡 (正例極少)
敏感度 對負例數量不太敏感 對正例數量敏感 (專注於正例表現)
誤報反映 間接反映 (FPR) 直接反映 (Precision)

程式實例

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.metrics import (
    confusion_matrix, ConfusionMatrixDisplay,
    accuracy_score, precision_score, recall_score, f1_score,
    roc_auc_score, average_precision_score
)
import matplotlib.pyplot as plt

# 資料
X, y = load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, stratify=y, random_state=42
)

# 模型
clf = Pipeline([
    ("scaler", StandardScaler()),
    ("svc", SVC(kernel="rbf", probability=True, random_state=42))
])
clf.fit(X_train, y_train)

# 預測
y_pred = clf.predict(X_test)
y_proba = clf.predict_proba(X_test)

# 混淆矩陣
cm = confusion_matrix(y_test, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm)
disp.plot(cmap=plt.cm.Blues)
plt.show()

# 評估
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Macro Precision:", precision_score(y_test, y_pred, average="macro"))
print("Macro Recall:", recall_score(y_test, y_pred, average="macro"))
print("Macro F1:", f1_score(y_test, y_pred, average="macro"))
print("Weighted F1:", f1_score(y_test, y_pred, average="weighted"))

# 多分類 ROC-AUC
roc_auc = roc_auc_score(y_test, y_proba, multi_class="ovr", average="macro")
print("Macro ROC-AUC:", roc_auc)

# 多分類 PR-AUC
pr_auc = average_precision_score(y_test, y_proba, average="macro")
print("Macro PR-AUC:", pr_auc)

結語

混淆矩陣是分類評估的根基,所有指標都只是對它不同切面的計算與加權,再次提醒,選指標時必須回到業務背景與資料特性,不要迷信某個數值越高越好,真正有價值的模型評估,是能在技術表現與業務需求之間找到平衡。


上一篇
(Day 10) 支援向量機 (Support Vector Machine)
下一篇
(Day 12) 多元分類任務驗證指標
系列文
30 天入門常見的機器學習演算法30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言